package DianShang_2024.ds_server.indicator

import org.apache.spark.sql.{DataFrame, SparkSession}

object trait01 {
  def main(args: Array[String]): Unit = {
    /*

                 注：与订单金额计算相关使用order_money字段，同一个订单无需多次重复计算，需要考虑退款或者取消的订单

             1、根据dwd或者dws层表统计每人每天下单的数量和下单的总金额，存入dws层（需自建）的user_consumption_day_aggr表中（表结构如下），然后使用hive cli按照
             客户主键、订单总金额均为降序排序，查询出前5条；
        */

    //  准备 sparksql的环境
     val spark=SparkSession.builder()
       .appName("指标计算第一题")
       .master("local[*]")
       .enableHiveSupport()
       .getOrCreate()

    spark.sql("use dws")
    //   设置动态分区
    spark.sql("set hive.exec.dynamic.partition.mode=nonstrict")

    //  需要注意的是，如果是多表查询的话最好指定表明，再指定字段名
    //  其次如果使用的是动态分区的表下面不指定etl_date的值，否则查不到数据
    /*
            需要注意的是, 因为create_time是20240311这样的字符串，所以不可以使用date_format函数，否则会直接转化为 null
             需要先转换数据类型，使用 to_timestamp函数，并且格式为yyyyMMdd后面再使用date_format函数将时间格式的数据格式化为yyyy-MM-dd
     */
//    spark.sql(
//      """
//        |select
//        |t1.customer_id as customer_id,
//        |t2.customer_name as customer_name,
//        |sum(t1.order_money) as total_amount,
//        |count(*) as total_count,
//        |year(date_format(to_timestamp(t1.create_time,'yyyyMMdd'),'yyyy-MM-dd')) as year,
//        |month(date_format(to_timestamp(t1.create_time,'yyyyMMdd'),'yyyy-MM-dd')) as month,
//        |day(date_format(to_timestamp(t1.create_time,'yyyyMMdd'),'yyyy-MM-dd')) as day
//        |from dwd_server.fact_order_master as t1
//        |join dwd_server.dim_customer_inf as t2
//        |on t1.customer_id=t2.customer_id
//        |group by t1.customer_id,t2.customer_name,year,month,day
//        |""".stripMargin).createOrReplaceTempView("temp_table")
//
//    spark.sql("select * from temp_table").show
//
//    //  根据题目要求创建dws里面的表
//    spark.sql(
//      """
//        |create table if not exists dws.user_consumption_day_aggr(
//        |customer_id int,
//        |customer_name string,
//        |total_amount double,
//        |total_count int
//        |)
//        |partitioned by(year int,month int,day int)
//        |""".stripMargin)
//
//
//
//    //  根据条件插入表格数据
//
//    spark.sql(
//      """
//        |insert into table  dws.user_consumption_day_aggr
//        |partition(year,month,day)
//        |select
//        |customer_id ,
//        |customer_name ,
//        |total_amount ,
//        |total_count,
//        |year,
//        |month,
//        |day
//        |from
//        |temp_table
//        |""".stripMargin)





    //  关闭sparksql的环境
    spark.close()
  }

}
